//
//  LZImageLoader.h
//  Project
//
//  Created by liting on 2025/8/29.
//

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import <SDWebImage/SDWebImage.h>

NS_ASSUME_NONNULL_BEGIN

typedef NS_ENUM(NSInteger, LZImageCacheType) {
    LZImageCacheTypeNone,      // 无缓存
    LZImageCacheTypeDisk,      // 磁盘缓存
    LZImageCacheTypeMemory     // 内存缓存
};

typedef void (^LZImageCompletionBlock)(UIImage * _Nullable image, NSError * _Nullable error, LZImageCacheType cacheType, NSURL * _Nullable imageURL);
typedef void (^LZImageProgressBlock)(NSInteger receivedSize, NSInteger expectedSize, NSURL * _Nullable targetURL);
typedef void (^LZImageDownloadCompletionBlock)(UIImage * _Nullable image, NSData * _Nullable data, NSError * _Nullable error, BOOL finished);

@interface LZImageLoader : UIView

#pragma mark - 单例方法
+ (instancetype)sharedLoader;

#pragma mark - 图片加载方法
/**
 加载网络图片

 @param urlString 图片URL字符串
 @param completion 完成回调
 */
- (void)loadImageWithURLString:(NSString *)urlString
                    completion:(nullable LZImageCompletionBlock)completion;

/**
 加载网络图片（带占位图）

 @param urlString 图片URL字符串
 @param placeholder 占位图
 @param imageView 目标ImageView
 @param completion 完成回调
 */
- (void)loadImageWithURLString:(NSString *)urlString
                  placeholder:(nullable UIImage *)placeholder
                    intoImageView:(nullable UIImageView *)imageView
                    completion:(nullable LZImageCompletionBlock)completion;

/**
 加载网络图片（带进度和完成回调）

 @param urlString 图片URL字符串
 @param placeholder 占位图
 @param imageView 目标ImageView
 @param progress 进度回调
 @param completion 完成回调
 */
- (void)loadImageWithURLString:(NSString *)urlString
                  placeholder:(nullable UIImage *)placeholder
                    intoImageView:(nullable UIImageView *)imageView
                      progress:(nullable LZImageProgressBlock)progress
                    completion:(nullable LZImageCompletionBlock)completion;

/**
 加载网络图片（带选项）

 @param urlString 图片URL字符串
 @param placeholder 占位图
 @param imageView 目标ImageView
 @param options SDWebImage选项
 @param progress 进度回调
 @param completion 完成回调
 */
- (void)loadImageWithURLString:(NSString *)urlString
                  placeholder:(nullable UIImage *)placeholder
                    intoImageView:(nullable UIImageView *)imageView
                       options:(SDWebImageOptions)options
                      progress:(nullable LZImageProgressBlock)progress
                    completion:(nullable LZImageCompletionBlock)completion;

#pragma mark - 图片下载方法
/**
 下载图片（不显示）

 @param urlString 图片URL字符串
 @param completion 完成回调
 */
- (void)downloadImageWithURLString:(NSString *)urlString
                        completion:(nullable LZImageDownloadCompletionBlock)completion;

/**
 下载图片（带进度）

 @param urlString 图片URL字符串
 @param progress 进度回调
 @param completion 完成回调
 */
- (void)downloadImageWithURLString:(NSString *)urlString
                          progress:(nullable LZImageProgressBlock)progress
                        completion:(nullable LZImageDownloadCompletionBlock)completion;

#pragma mark - 缓存管理
/**
 获取图片缓存大小（字节）

 @return 缓存大小
 */
- (NSUInteger)getCacheSize;

/**
 清除内存缓存
 */
- (void)clearMemoryCache;

/**
 清除磁盘缓存
 */
- (void)clearDiskCache;

/**
 清除所有缓存
 */
- (void)clearAllCache;

/**
 清除过期缓存
 */
- (void)clearExpiredCache;

/**
 检查图片是否缓存

 @param urlString 图片URL字符串
 @return 是否缓存
 */
- (BOOL)isImageCachedForURLString:(NSString *)urlString;

#pragma mark - 工具方法
/**
 获取缓存的图片

 @param urlString 图片URL字符串
 @return 缓存的图片
 */
- (nullable UIImage *)getCachedImageForURLString:(NSString *)urlString;

/**
 预加载图片

 @param urlStrings 图片URL字符串数组
 */
- (void)preloadImages:(NSArray<NSString *> *)urlStrings;

/**
 取消图片加载

 @param imageView 目标ImageView
 */
- (void)cancelImageLoadForImageView:(UIImageView *)imageView;

/**
 设置最大并发下载数

 @param count 最大并发数
 */
- (void)setMaxConcurrentDownloads:(NSInteger)count;

/**
 设置超时时间

 @param timeout 超时时间（秒）
 */
- (void)setDownloadTimeout:(NSTimeInterval)timeout;

@end

NS_ASSUME_NONNULL_END
